/**
 * @p.md
 * 
 * Actor 是 Actor 模型的核心组件
 */
import { Context } from './context';
import { PID } from './pid';

/**
 * Actor 接口定义了接收消息的方法
 */
export interface Actor {
  /**
   * 接收并处理消息
   * @param context 当前 Actor 上下文
   */
  receive(context: Context): void | Promise<void>;
}

/**
 * 函数式 Actor
 */
export type ReceiveFunc = (context: Context) => void | Promise<void>;

/**
 * 函数式 Actor 适配器
 * 将函数转换为 Actor 对象
 */
export class FunctionActor implements Actor {
  constructor(private fn: ReceiveFunc) {}

  receive(context: Context): void | Promise<void> {
    return this.fn(context);
  }
}

/**
 * 创建新 Actor 的工厂函数
 */
export type Producer = () => Actor;

/**
 * 接收器函数类型，用于接收和处理消息信封
 */
export type ReceiverFunc = (context: Context, envelope: MessageEnvelope) => void;

/**
 * 发送器函数类型，用于发送消息信封到指定目标
 */
export type SenderFunc = (context: Context, target: PID, envelope: MessageEnvelope) => void;

/**
 * 上下文装饰器函数类型，用于修改 Context 行为
 */
export type ContextDecoratorFunc = (context: Context) => Context;

/**
 * 消息信封，封装消息和发送者
 */
export interface MessageEnvelope {
  /**
   * 消息内容
   */
  message: any;
  
  /**
   * 发送者的 PID，可以为空
   */
  sender?: PID;
}

/**
 * 从函数创建 Actor 的辅助函数
 * @param fn Actor 处理函数
 */
export function fromFunc(fn: ReceiveFunc): Actor {
  return new FunctionActor(fn);
} 